package com.ww.java8.fp.stream.onjava8.ch14;

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

/**
 * 在建造者模式中，首先创建一个builder对象，然后将创建流所需的多个信息传递给它，最后builder对象执行“创建”流的操作。Stream库提供了这样的
 * Builder。
 */
public class FileToWordsBuilder {

    Stream.Builder<String> builder = Stream.builder();

    public FileToWordsBuilder(String filePath) throws Exception {
        System.out.println("文件路径：" + filePath);
        Files.lines(Paths.get(filePath))
                // 略过开头的注释
                .skip(1)
                .forEach(line -> {
                    for (String w : line.split("[ .?,]+")) {
                        builder.add(w);
                    }
                });
    }

    Stream<String> stream() {
        // Stream.Builder在调用build()方法后继续尝试添加单词会产生一个异常
        return builder.build();
    }

    public static void main(String[] args) throws Exception {
        new FileToWordsBuilder(FileToWordsBuilder.class.getResource("/").getPath().substring(1) + "Cheese.dat")
                .stream()
                .limit(7)
                .map(w -> w + " ")
                .forEach(System.out::print);
    }
}
